//: Playground - noun: a place where people can play

import UIKit

//: # swfit 读书笔记


//: ### 闭包表达式:  闭包表达式参数 可以是 in-out 参数，但不能设定默认值。也可以使用具名的可变参数,元组也可以作为参数和返回值 但是如果可变参数不放在参数列表的最后一位的话，调用闭包的时时编译器将报错。

/*
 { (parameters) -> returnType in
    statements
 }
 */
//: ### 带有 可变参数 和 具名可变参数的闭包

func ClosuresTwo(two:(_ blockOne:(age:Int,name:String))->Void){
    
}

func ClosuresOne(one:(_ blockOne:String,_ numbers:Int...)->Void){
    one ("zzp", 1,2,1,2)
}


func ClosureTwo(Two:()->Void){
    Two()
}

//: ### 尾随闭包
print("_____________________尾随闭包_____________________________")
//: 没有参数
ClosureTwo {
    
}
//: 有参数
ClosuresOne { (name, numbers:Int...)  in
    for value in  numbers{
        print(name + "\(value)")
    }
}

//: ### 值捕获  闭包可疑捕获其代码块中的常量和变量
print("_____________________值捕获_____________________________")
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}

//: 此时 runningTotal 的值是 10
let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen ()

//: 此时 runningTotal 的值是 7
let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven ()

//: ### 逃逸闭包: 在异步方法的闭包需要是逃逸的  标注 @escaping
//: ### 逃逸闭包要显示使用 self (self.属性)  其他可以是隐式的

//: ### 自动闭包  这种闭包不接受任何参数，当它被调用的时候，会返回被包装在其中的表达式的值。这种便利语法让你能够省略闭包的花括号，用一个普通的表达式来代替显式的闭包
print("_____________________自动闭包_____________________________")
func autoClosure (autoClosure:()->Bool){
    autoClosure ()
}

autoClosure {
    2 > 1
}

func autoClosureTwo ( autoClosureTwo:@autoclosure ()->Bool){
    autoClosureTwo ()
}

autoClosureTwo (autoClosureTwo: 2>1)

//: 没看出来和 没有参数的尾随闭包有毛区别
